﻿using System;
using System.ComponentModel;
using System.Threading.Tasks;

namespace HYGE.AsyncCommand
{
    /// <summary>
    /// 非同期実行コマンドが発行するジョブが実装するインターフェース。
    /// </summary>
	public interface IAsyncJob : INotifyPropertyChanged, IDisposable
    {
        #region Properties

        #region CanBeCanceled
        /// <summary>
        /// ジョブをキャンセルできるかどうかを表すフラグ。キャンセルできる場合に限り、True。
        /// </summary>
        bool CanBeCanceled
		{
			get;
		}
        #endregion

        #region IsRunning
        /// <summary>
        /// ジョブが実行中かどうかを表すフラグ。実行中である場合に限り、True。
        /// </summary>
        bool IsRunning
		{
			get;
		}
        #endregion

        #region IsCompleted
        /// <summary>
        /// ジョブが完了したかどうかを表すフラグ。完了した場合に限り、True。
        /// </summary>
		bool IsCompleted
		{
			get;
		}
        #endregion

        #region IsCanceled
        /// <summary>
        /// ジョブ実行中にキャンセルされたかどうかを表すフラグ。キャンセルされた場合に限り、True。
        /// </summary>
		bool IsCanceled
		{
			get;
		}
        #endregion

        #region IsFaulted
        /// <summary>
        /// ジョブ実行中に例外が発生したかどうかを表すフラグ。発生した場合に限り、True。
        /// </summary>
		bool IsFaulted
		{
			get;
		}
        #endregion

        #region Exception
        /// <summary>
        /// ジョブ実行中に発生したAggregateException。
        /// </summary>
		AggregateException Exception
		{
			get;
		}
        #endregion

        #region Description
        /// <summary>
        /// ジョブを説明する文字列。
        /// </summary>
        string Description
        {
            get;
        }
        #endregion

        #region Id
        /// <summary>
        /// ジョブの一意ID。
        /// </summary>
        int Id
        {
            get;
        }
        #endregion

        #endregion

        #region Methods

        #region Cancel
        /// <summary>
        /// 実行中のジョブにキャンセル要求を行う。
        /// </summary>
		void Cancel();
        #endregion

        #region Start
        /// <summary>
        /// ジョブを指定されたTaskSchedulerで開始する。
        /// </summary>
        void Start(TaskScheduler scheduler = null);
        #endregion

        #endregion
    }
}
